/**
 * 前面学习了类装饰器 ，类装饰默认接收一个参数参数 target  这个target就是这个类的构造函数
 *  可以操作这个构造函数的原型链 这样实例化的对象就会自动原型链攀升去后去装饰的数据
 *
 * 下面学习的是方法装饰器
 *    这一节是方法装饰器的基本用法
 *
 *  需要掌握
 *    基本API（能认识即可）
 *    接收的默认三个参数是什么（掌握）
 */
{
  const showDecorator: MethodDecorator = (
    target: Object,
    propertyKey: string | symbol,
    descriptor: PropertyDescriptor
  ) => {
    console.log("target", target); // target { show: [Function (anonymous)] }
    console.log("propertyKey", propertyKey); // show
    console.log("descriptor", descriptor); // descriptor {value: [Function (anonymous)],writable: true,enumerable: true,configurable: true}
    /**
     * 第一个参数
     *    如果是静态方法 那么就是构造函数
     *    如果不是静态方法是成员方法 那就是原型对象
     * 第二个参数是方法名称
     * 第三个参数是方法的属性特征
     */

    /**
     * 通过装饰器修改方法的内容
     */
    descriptor.value = () => {
      console.log("通过方法装饰器修改方法内容");
    };
  };

  class User {
    /**
     * 装饰器放在类上面就是类装饰器 放在方法上面就是方法装饰器
     */
    @showDecorator
    show() {
      console.log("hello world");
    }
  }

  new User().show(); // 通过方法装饰器修改方法内容
  /**
   * 可见 方法被我们给改了 输出的不是hello world  而是 通过方法装饰器修改方法内容
   *
   */
}
